const https = require('https');
const buffer = require('buffer')
var fs = require('fs')
var path = require('path')
// let axios = require('axios')
const axios = require('./utils/http.js')
var xlsx = require('node-xlsx');
const cheerio = require('cheerio');
const userAgents = require('./utils/userAgent.js');
const nodeXlsx = require('node-xlsx')
var request = require("request");
const gm = require('gm')
let download = require('download')
// axios.defaults.withCredentials = true
const http = require('http');
// const tesseract = require("node-tesseract-ocr")
const tesseract = require("tesseract.js")
// const tesseract = require("node-tesseract")
// const tesseract = require("tesseractocr")

const tesconfig = {
    lang: "eng",
    oem: 1,
    psm: 3,
}

let dwUrl = 'http://www.innojoy.com/client/interface.aspx'
var companyName = ''
var fileName
let companyIndex = 0
let data = nodeXlsx.parse('./data.xls');
let execlData = []
let temObj = {}
// 464 k2
var execlIndex = 1643
var zhutiData = []
var pageIndex = 1

//下方ex1是读取出来的数组，数组长度取决于Excel文件的工作表(sheet)
// const ex1 = nodeXlsx.parse("./260gu.xlsx")	//读取excel表格


// let excel_content = ex1[0].data	//取出excel文件中的第一个工作表中的全部数据
const queryUrl = 'http://www.innojoy.com/client/interface.aspx'
const loginUrl = 'http://www.innojoy.com/front/user/userManager'
const qrCodeUrl = 'http://www.innojoy.com/server/user/userManager'

let queryParams = {
    language: 'zh',
    patentSearchConfig: {
        Action: 'Search',
        AddOnes: '',
        DBOnly: 0,
        Database: "mopat,hkpat,twpat,fmsq,wgzl,syxx,fmzl",
        DelOnes: '',
        GUID: '',
        IsPatentList: true,
        Page: "2",
        PageSize: '10',
        Query: '九阳股份有限公司',
        // Query: '张本红',
        RemoveOnes: '',
        SmartSearch: '',
        Sortby: '',
        TreeQuery: '',
        TrsField: ''
    },
    requestModule: 'PatentSearch',
    userId: "E5D73753-440C-476E-9E76-B067F4041220"
}
const qrcodeParams = {
    language: 'zh',
    userConfig: {
        Action: 'GetChkImageSearchBase64',
        GUID: 'f09ee514dc894a01989a5342c72173cc'
    },
    requestModule: 'UserManager',
    userId: "E5D73753-440C-476E-9E76-B067F4041220"
}
let checkParams = {
    language: 'zh',
    userConfig: {
        Action: 'Verification',
        ChkCode: '',
        GUID: '93f4081c502343649746c8c861f1021d'
    },
    requestModule: 'UserManager',
    userId: "E5D73753-440C-476E-9E76-B067F4041220"
}
const queryList = (params, queryUrl) => {
    return new Promise((resolve, reject) => {
        axios({
            headers: {
                'content-type': 'application/json',
                'referer': 'http://www.innojoy.com/searchresult/default.html'
            },
            method: 'post',
            url: queryUrl,
            data: params
        }).then(res => {
            resolve(res)
        }).catch((err) => {
            reject(err)
            console.log(execlIndex, fileName, '1235')
        })
    })
}


// execl 数据去重
data[0].data.forEach(item => {
    if (!temObj[item[1]]) {
        temObj[item[1]] = 1
        execlData.push(item)
    }
})
execlData.shift()

let type = 1 // 1-个人 2-企业
var dwParam
let total = 0
let sf = ''
let nameArr = []
let carArr = []
let ipcArr = []
let ipcStr1 = ''
let ipcStr2 = ''
let ipc = ''
let bCIpc = '' //大类ipc
let sCIpc = '' //小类ipc
let bGIpc = '' //ipc大组
let sGIpc = '' //ipc小组
let ipcN = '' //分类数
let bGbc = '' //gbc大类
let mGbc = '' //gbc种类
let gbcTem = []
let arArr = []
let qsheng = '' //申请人省
let qshi = ''   //申请人市
let qxian = ''  //申请人县
let prDate = '' //最早优先权日
let prTemArr = []
let CLSLLS = '' //当前法律状态
let CLTemStr1 = '授权部分无效权利恢复'
let CLTemStr2 = '终止撤回驳回届满全部无效避重放弃未缴年费视为放弃主动放弃'
let text = ''


const writeDir = () => {
    if (fs.existsSync(`${__dirname}/execlFile2/${fileName}.xls`)) {
        fs.unlinkSync(`${__dirname}/execlFile2/${fileName}.xls`)
    }
    var buffer
    var data = []
    var addInfo = {};
    //名称
    addInfo.name = fileName;
    //数据数组
    addInfo.data = [
        ["编码", "主体", "身份", '序号', '文献号', '名称', '摘要', '主权项', '技术关键词', '申请人',
            '标准申请人', '申请人数', '申请人地址', '申请人国家/地域', '申请人(省市)', '申请人(地市)', '申请人(区县)',
            '主申请人', /*'主申请人国家/地域',*/ '技术来源国家/地域', '受理局', /*'申请人类型',*/ /*'预测专利权人',*/
            '当前专利权人', '标准当前专利权人', '当前地址', /*'当前专利权人(省市)', '当前专利权人(地市)','当前专利权人(区县)',*/
            '发明(设计)人', '发明人数', '主发明人', '专利代理机构', '标准专利代理机构',
            '代理人', '审查员', /*'DPI', '', '', '', '', '', */'被引证数', '被审查员引证数',
            '引证专利', '引证专利数', '引用专利国别/地域数', '引用非专利文献', '引用非专利文献数',
            '专利类型', /*'IPC部数', 'IPC小类数',*/ '权项数', '独权数', '主权项字数', '说明书页数',
            '存活期', '剩余有效期', '同族数', '布局国家/地域数', 'innojoy同族数', 'innojoy布局国家/地域数',
            'PCT国际申请', '三方专利(美日欧)', '专利奖', '专利奖获奖年份', '复审决定', '无效决定', '无效次数',
            '转让次数', '转让人', '受让人', '转让生效日', '转让人地址', '受让人地址', '许可次数', '许可人',
            '被许可人', '许可生效日', '质押次数', '出质人', '质权人', '质押生效日', '申请号', '申请号(无校验位)',
            '申请年', '申请日', '公开(公告)号', '公开（公告）年', '公开(公告)日', '实审公告日', '授权公告日',
            '权利失效日', '布局国家/地域', '分案原申请号', '分案申请号', '优先权', '最早优先权日',
            '最早优先权国家/地域', '国际申请', '国际申请日', '国际公布', '国际公开日', '进入国家日期', 'ETSI标准',
            '标准号', '申报公司', '申报日期', 'IPC', '主IPC分类号', 'IPC大类', 'IPC小类', 'IPC大组', 'IPC小组',
            'IPC分类数', 'LOC分类号', 'LOC分类数', 'CPC', 'CPC分类数', 'C-sets',
            '日本FI分类号', '日本FI分类数', '日本F-term分类号', '行业领域', 'GBC', '主GBC分类号', 'GBC分类数',
            'GBC门类', 'GBC大类', 'GBC中类', 'GBC小类', '新兴产业分类', '新兴产业分类数', '药品名称', '药品品牌',
            '药品成分', '药品剂型', '药品用法', '药品用量', '当前法律状态', '当前法律状态公告日', '审查时长(月)',
            '审查信息', '法律状态履历', '国省代码', '一案双申', '海关备案专利'
        ]
    ]
    nameArr = fileName.split('_')
    zhutiData.forEach((item, index) => {
        if (item && item.CAR) {
            carArr = item.CAR.split(';')
            if (carArr.length === 2) {
                carArr = carArr[0].split(" ")
            } else {

            }
        }


        if (item.AR) {
            arArr = item.AR.split(/[省市]/)
            qsheng = arArr[0]
            qshi = arArr[1]
            qxian = arArr[2]
        } else {
            qsheng = ''
            qshi = ''
            qxian = ''
        }
        sf = ''
        if (nameArr[1] === item.PPA) {
            sf += ' 申请人'
        }
        if (item.INNTMS.indexOf(nameArr[1]) > -1) {
            sf += ' 发明人'
        }
        if (item.CAS.indexOf(nameArr[1]) > -1) {
            sf += ' 专利权人'
        }
        // 优先权
        if (item.PR) {
            prTemArr = item.PR.split(' ')
            if (prTemArr.length === 2) {
                prDate = prTemArr[1]
            } else {
                prDate = ''
            }
        } else {
            prDate = ''
            prCountry = ''
        }
        // IPC分类号
        if (item.SIC) {
            ipcArr = item.SIC.split(';')
            if (ipcArr.length === 2) {
                ipcStr1 = ipcArr[0].split(' ')[0]
                ipcStr2 = ipcArr[1].split(' ')[0]
                if (ipcStr2 && ipcStr1) {
                    ipc = ipcStr1 + ';' + ipcStr2
                    if (ipcStr1.substring(0, 3) === ipcStr2.substring(0, 3)) {
                        bCIpc = ipcStr1.substring(0, 3)
                    } else {
                        bCIpc = ipcStr1.substring(0, 3) + ';' + ipcStr2.substring(0, 3)
                    }
                    if (ipcStr1.substring(0, 4) === ipcStr2.substring(0, 4)) {
                        sCIpc = ipcStr1.substring(0, 4)
                    } else {
                        sCIpc = ipcStr1.substring(0, 4) + ';' + ipcStr2.substring(0, 4)
                    }
                    if (ipcStr1.split('/')[0] === ipcStr2.split('/')[0]) {
                        bGIpc = ipcStr1.split('/')[0]
                    } else {
                        bGIpc = ipcStr1.split('/')[0] + ';' + ipcStr2.split('/')[0]
                    }
                    sGIpc = ipcStr1
                    ipcN = ipcArr.length
                } else {
                    ipc = ''
                    bCIpc = ''
                    sCIpc = ''
                    bGIpc = ''
                    sGIpc = ''
                    ipcN = ''
                }
            } else if (ipcArr.length === 1) {
                ipcStr1 = ipcArr[0].split(' ')[0]
                ipc = ipcStr1
                bCIpc = ipcStr1.substring(0, 3)
                sCIpc = ipcStr1.substring(0, 4)
                bGIpc = ipcStr1.split('/')[0]
                sGIpc = ipcStr1
                ipcN = ipcArr.length
            } else {
                ipc = ''
                bCIpc = ''
                sCIpc = ''
                bGIpc = ''
                sGIpc = ''
                ipcN = ''
            }
        }
        // GBC分类号
        if (item.GBC) {
            gbcTem = [...new Set(item.GBC.split(';').map(item => item.substring(0, 4)))]
            mGbc = gbcTem.reduce((a, b) => a + ';' + b)
            gbcTem = [...new Set(item.GBC.split(';').map(item => item.substring(0, 3)))]
            bGbc = gbcTem.reduce((a, b) => a + ';' + b)
        } else {
            mGbc = ''
            bGbc = ''
        }

        if (item.CLS || item.LLS) {
            if (CLTemStr1.indexOf(item.CLS) > -1 || CLTemStr1.indexOf(item.LLS) > -1) {
                CLSLLS = '有权'
            } else {
                if (CLTemStr2.indexOf(item.CLS) > -1 || CLTemStr2.indexOf(item.LLS) > -1) {
                    CLSLLS = '无权'
                } else {
                    CLSLLS = '审中'
                }
            }
        } else {
            CLSLLS = ''
        }
        addInfo.data.push([nameArr[0], nameArr[1], sf, index + 1,
        item.DN, item.TI.split('[ZH]')[0],
        item.CD.split('<abstract lang=\"ZH\" load-source=\"sipo\">').length > 1 ? item.CD.split('<abstract lang=\"ZH\" load-source=\"sipo\">')[1].split('</abstract>')[0] : '',
        item.CD.split('<claim-text>').length > 1 ? item.CD.split('<claim-text>')[1].split('</claim-text>')[0] : '',
        item.KEYWORDCN, item.PPA, item.SPATMS, item.PAN, item.AR, item.PACC,
            qsheng, qshi, qxian,
        // item.CD.split('<state>').length > 2 ? item.CD.split('<state>')[2].split('</state>')[0] : '',
        // item.CD.split('<city>').length > 2 ? item.CD.split('<city>')[2].split('</city>')[0] : '',
        // item.CD.split('<county>').length > 2 ? item.CD.split('<county>')[2].split('</county>')[0] : '',
        // item.ADDRP, item.ADDRC, item.ADDRDC,
        // 主申请人 技术来源国家/地域 受理局 当前专利权人
        item.PPA,/* item.PPACC ,*/ item.TOC, item.RO, /*item.SQRLX,*/ /* item.PAS ,*/item.CAS, item.SCASTMS,

        item.CAR,/*item.CASP, item.CASC, item.CASD,*/
        //发明设计人 发明人数 主发明人 专利代理结构  标准专利代理机构 代理人
        item.INNTMS, item.INNN, item.PINN, item.AGC, item.SAGC, item.AGT,
        //审查员 自定义DPI dpi1 dpi2 dpi3 dpi4 dpi5
        item.EXM,/* item.INNOJOY_DPI, item.DPIT, item.DPIL, item.DPIE, item.DPIM, item.DPIS, */
        /*item.IDXStar,*/
        // 被引证数  被审查引证数  引证专利  引证专利数  引证国家地区  引用非专利文献 引用非专利文献数  专利类型  
        item.REFBYN, item.REFBSCYN, item.REFP, item.REFPN, item.REFPCN, item.REFNP, item.REFNPN, item.PAT,

        //IPC部数 IPC小类数 权项数 独权数 主权项字数 说明书页数 存活期 存活期 同族数 布局国家/地域数
        /*item.IPCBN,item.IPCSCN,*/ item.CLMN, item.ICLMN, item.CLZS, item.DPN, item.CHQ, item.RET, item.SFMLN, item.SFMLCN,
        // innojoy同族数 innojoy布局国家/地域数 PCT国际申请？ 三方专利(美日欧)？ 专利奖 专利奖获奖年份 复审决定 无效决定 无效次数
        item.IFMLN, item.IFMLCN, item.ISPCT, item.ORG4, item.WINPS, item.WINPSY, item.EAR, item.CRAI, item.INV,
        item.TRA, item.ZRR, item.SRR, item.ZRZXR, item.ZRA, item.SRA, item.LIC, item.XKR, item.BXKR, item.XKBAR,
        //质押次数 出质人 质权人 质押生效日 申请号 申请号(无校验位) 申请年 申请日 公开(公告)号 公开(公告)年 公开(公告)日
        item.PLE, item.CZR, item.ZQR, item.ZYBAR, item.AN, item.AN.split('.')[0], item.AD ? item.AD.split('.')[0] : item.ADY, item.AD, item.PNM, item.PD ? item.PD.split('.')[0] : item.PDY, item.PD,
        // 实审公告日 授权公告日 权利失效日 '布局国家/地域', '分案原申请号', '分案申请号', '优先权' 最早优先权日 
        item.SSGGR, item.SQGGR, item.LLSD, item.DBName.indexOf('中国') > -1 ? '中国' : '', item.DAN, item.ODAN, item.PR, prDate,
        item.EPRC, item.IAN, item.IAD, item.IPN, item.IPD, item.DEN, item.ETSIBZ, item.BZH, item.BZC, item.BZD,
            //IPC 主IPC分类号 IPC大类 IPC小类 IPC大组 IPC小组 IPC分类数 LOC分类号 LOC分类数

            ipc, item.PIC.split('/').length > 1 ? item.PIC : '', bCIpc, sCIpc, bGIpc, sGIpc, ipcN, item.PIC.split('/').length > 1 ? '' : item.PIC, item.PIC.split('/').length > 1 ? '' : 1, item.CPC,
        item.CPCN, item.CPCSETS, item.FIC, item.FICN, item.FTERM, item.SBJA, item.GBC, item.PGBC, item.GBCN,
        //GBC门类 GBC大类 GBC中类 GBC小类 新兴产业分类 新兴产业分类数
        item.PGBC.substring(0, 1), bGbc, mGbc, item.GBC, item.EINDC, item.EINDCN, item.PTEN, item.PB, item.PI,
        //药品剂型 药品用法 药品用量 当前法律状态 当前法律状态公告日 审查时长(月) 审查信息 法律状态履历
        item.PF, item.PRT, item.PST, CLSLLS, item.LLSD, item.SCSC, item.SCXX, item.LS, item.CO, item.RAN, item.CFP ? '是' : '否'
        ])
    })
    data.push(addInfo)
    options = {
        sheetOptions: {
            '!cols': data[0].data[0].map(item => ({ wch: 15 })),
            '!rows': data[0].data.map((item, index) => { if (index == 0) { return { hpx: 40 } } else { return { hpx: 100 } } })
        }
    }
    buffer = nodeXlsx.build(data, options);
    fs.writeFileSync(path.join(__dirname, `./execlFile2/${fileName}.xls`), Buffer.from(buffer));
}
const startD = () => {
    if (execlIndex >= execlData.length) {
        return
    }
    companyName = execlData[execlIndex][1]
    if (execlData[execlIndex][1].length > 3) {
        type = 2
    } else {
        type = 1
    }
    if (execlData[execlIndex][1].indexOf('*') > -1) {
        ++execlIndex
        startD()
        console.log('主体不能含有特殊符号')
        return
    }
    queryParams = {
        language: 'zh',
        patentSearchConfig: {
            Action: 'Search',
            AddOnes: '',
            DBOnly: 0,
            Database: "mopat,hkpat,twpat,fmsq,wgzl,syxx,fmzl",
            DelOnes: '',
            GUID: 'TWbiS9D2410090240fpWagH6',
            IsPatentList: true,
            Page: pageIndex,
            PageSize: '100',
            Query: execlData[execlIndex][1],
            RemoveOnes: '',
            SmartSearch: '',
            Sortby: '',
            TreeQuery: '',
            TrsField: ''
        },
        requestModule: 'PatentSearch',
        userId: "E5D73753-440C-476E-9E76-B067F4041220"
    }
    queryList(queryParams, queryUrl).then(res => {
        if (res.ErrorInfo === 'no patent found.') {
            ++execlIndex
            startD()
            return
        }
        if (res && res.Option) {
            if (total === 0) {
                total = res.Option.Count
                fileName = execlData[execlIndex][0] + '_' + execlData[execlIndex][1] + '_' + type + '_'
                fileName += total + '_' + Math.floor(Math.random() * 100)
            }
            if (!Array.isArray(res.Option.PatentList)) {
                console.log(res, 'no array')
            }
            console.log(execlIndex, pageIndex, fileName, zhutiData.length)
            ++pageIndex
            zhutiData = zhutiData.concat(res.Option.PatentList)
            if (total > zhutiData.length && zhutiData.length < 20000) {
                if (pageIndex >= 200 && pageIndex * 100 - total > -1) {
                    zhutiData = zhutiData.slice(0, 20000)
                    writeDir()
                    zhutiData = []
                    pageIndex = 1
                    ++execlIndex
                    total = 0
                    startD()
                } else {
                    timer = setTimeout(() => {
                        startD()
                    }, Math.random() * 2 * 1000)
                }
            } else {
                if (zhutiData.length >= 20000) {
                    writeDir()
                    zhutiData = []
                    --pageIndex
                    // ++execlIndex
                    total = 0
                    startD()
                } else {
                    writeDir()
                    zhutiData = []
                    pageIndex = 1
                    ++execlIndex
                    total = 0
                    startD()
                }
            }
        } else {
            if (res.ErrorInfo === 'verification') {
                queryList(qrcodeParams, qrCodeUrl).then(res => {
                    let str = res.Option[0]
                    let guid = res.Option[1]
                    const basePath = path.join(__dirname + '/assets', '1.png');
                    var dataBuffer = Buffer.from(str, 'base64');
                    fs.writeFile(basePath, dataBuffer, function (err) {
                        if (err) {
                            //   res.send(err);
                        } else {
                            console.log("保存base64成功")
                            gm(__dirname + '/assets/1.png')
                                .resize(800, 400)
                                .threshold(22000)  //阈值变色
                                // .noProfile()
                                .write(__dirname + '/assets/2.png', (err) => {
                                    console.log(1)
                                    if (err) console.log(err)
                                    tesseract.recognize(
                                        __dirname + '/assets/2.png',
                                        'eng',
                                        // { logger: m => console.log(m) }
                                    ).then((res) => {
                                        // .then(({ data: { text } }) => {
                                        if (res && res.data) {
                                            text = res.data.text
                                            checkParams.userConfig.ChkCode = text.trim()
                                            checkParams.userConfig.GUID = guid
                                            console.log(checkParams)
                                            queryList(checkParams, qrCodeUrl).then(res => {
                                                console.log(res, '验码码')
                                                if (!res.IsGetCheckPic) {
                                                    setTimeout(() => {
                                                        startD()
                                                    }, 3000)
                                                    console.log(text, '验证成功')
                                                }
                                            }).catch(err => {
                                                console.log(err)
                                            })
                                        } else {
                                            console.log(res)
                                        }
                                    })
                                });
                        }
                    })

                }).catch(err => {
                    console.log('verification', execlIndex)
                    setTimeout(() => {
                        startD()
                    }, 1000 * 3 * 60)
                })
            } else {
                console.log(res,'无效情况')
                writeDir()
                zhutiData = []
                pageIndex = 1
                ++execlIndex
                total = 0
                startD()
            }
        }
    }).catch(err => {
        if (err === '说明书不存在') {
            ++execlIndex
            startD()
        } else {
            setTimeout(() => {
                // --execlIndex
                startD()
            }, 1000 * 60 * 3)
        }
        console.log(err, '错误')
        console.log(execlIndex, pageIndex, fileName, zhutiData.length)
    })
}

startD()






